home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-28 | 2.7 KB | 156 lines | [TEXT/CWIE] |
- // List.cp
-
- #ifndef List_h
- #include "List.h"
- #endif
- #ifndef ListNode_h
- #include "ListNode.h"
- #endif
- #ifndef SequenceLoop_h
- #include "SequenceLoop.h"
- #endif
-
- List::List()
- : first( 0 ),
- last( 0 )
- {
- }
-
- List::~List()
- {
- Assert( IsEmpty() );
- }
-
- void List::Add( Node& node, BeforeStart )
- {
- Assert( !node.Owned() );
-
- WillAdd( node, after, 0 );
-
- node.previous = 0;
- node.next = first;
- first = &node;
- if ( node.next != 0 )
- node.next->previous = &node;
- else
- last = &node;
- node.owner = this;
- }
-
- void List::Add( Node& node, AfterEnd )
- {
- Assert( !node.Owned() );
-
- WillAdd( node, before, 0 );
-
- node.next = 0;
- node.previous = last;
- last = &node;
- if ( node.previous != 0 )
- node.previous->next = &node;
- else
- first = &node;
- node.owner = this;
- }
-
- void List::Add( Node& node, Before, const Node& position )
- {
- Assert( !node.Owned() );
- Assert( position.owner == this );
-
- WillAdd( node, before, &position );
-
- node.next = const_cast< Node * >( &position );
- node.previous = position.previous;
- node.next->previous = &node;
- if ( node.previous != 0 )
- node.previous->next = &node;
- else
- first = &node;
- node.owner = this;
- }
-
- void List::Add( Node& node, After, const Node& position )
- {
- Assert( !node.Owned() );
- Assert( position.owner == this );
-
- WillAdd( node, after, &position );
-
- node.next = position.next;
- node.previous = const_cast< Node * >( &position );
- node.previous->next = &node;
- if ( node.next != 0 )
- node.next->previous = &node;
- else
- last = &node;
- node.owner = this;
- }
-
- void List::Add( Node& node, Before, const Loop& position )
- {
- Assert( &position.Owner() == this );
- Assert( position.Unfinished() );
- Assert( !node.Owned() );
-
- if ( !position.Null() )
- Add( node, before, *position );
- else
- {
- const Node *previous = position.Previous();
-
- if ( previous == 0 )
- Add( node, beforeStart );
- else
- Add( node, after, *previous );
- }
- }
-
- void List::Add( Node& node, After, const Loop& position )
- {
- Assert( &position.Owner() == this );
- Assert( position.Unfinished() );
- Assert( !node.Owned() );
-
- if ( !position.Null() )
- Add( node, after, *position );
- else
- {
- const Node *next = position.Next();
-
- if ( next == 0 )
- Add( node, afterEnd );
- else
- Add( node, before, *next );
- }
- }
-
- void List::Remove( Node& node )
- {
- Assert( node.owner == this );
-
- WillRemove( node );
-
- if ( node.next != 0 )
- node.next->previous = node.previous;
- else
- last = node.previous;
-
- if ( node.previous != 0 )
- node.previous->next = node.next;
- else
- first = node.next;
-
- node.previous = 0;
- node.next = 0;
- node.owner = 0;
- }
-
- void List::RemoveAll()
- {
- while( !IsEmpty() )
- Remove( *first );
- }
-
- #include "Sequence.cp"
-